#ifndef NET_CLIENT_H
#define NET_CLIENT_H

#include <stdint.h>
#include <stdbool.h>
#include "../lvgl/lvgl.h"

// 服务器配置（可在外部修改）
extern int g_sockfd;

typedef struct
{
    const char * ip;     // 服务器IP
    uint16_t port;       // 服务器端口
    uint32_t timeout_ms; // 超时时间（毫秒）
} NetConfig;

// 消息类型（与服务器约定，覆盖所有屏幕的通讯需求）
typedef enum
{
    // 客户端主动发送的请求类型
    MSG_TYPE_LOGIN = 1,    // 登录请求（Screen1）
    MSG_TYPE_REGISTER = 2, // 注册请求

    // 新增：服务器主动推送的消息类型（从10开始避免与请求类型冲突）
    MSG_TYPE_SERVER_ONLINE_LIST = 10, // 服务器推送在线用户列表
    MSG_TYPE_CHAT_SEND = 20,          // 发送聊天消息（聊天Screen）
    MSG_TYPE_SERVER_CHAT_MSG = 30,    // 服务器推送聊天消息（转发自其他用户）
} MsgType;
// 网络响应结果
typedef struct
{
    MsgType type;      // 对应请求的消息类型
    int code;          // 状态码（0=成功，非0=失败）
    const char * data; // 响应数据（字符串，可能为JSON）
    void * user_data;  // 透传数据（如请求来源的screen指针）
} NetResponse;

typedef struct
{
    int type;                        // 消息类型
    char data[1024];                 // 发送的数据
    void (*callback)(NetResponse *); // 回调函数
    void * user_data;                // 用户数据（透传）
} WorkerArg;
// 响应回调函数（网络模块通知UI模块时调用）
// 注意：该回调在子线程中执行，不可直接操作UI，需通过lv_event_send转发
typedef void (*NetCallback)(NetResponse * resp);

// 初始化网络模块（需在main中调用）
void net_client_init(NetConfig * config);

// 发送消息（各screen调用此接口发送请求）
// 参数：
//   type：消息类型
//   data：发送的数据（字符串，如JSON）
//   callback：响应回调函数
//   user_data：透传数据（如当前screen指针）
bool net_client_send(MsgType type, const char * data, NetCallback callback, void * user_data);

// 断开连接（程序退出或需要重连时调用）
void net_client_disconnect(void);

// 在 net_client.h 中添加
extern void net_send_private_msg(int to_user_id, const char* msg);
#endif